E) Reference & Const

const 값에 대한 참조
const int value=5;
const int& ref=value; // ref is reference to const value
Initializing references to const values
const 참조는 non-const 값, const 값, Rvalue로 초기화할 수 있다.
int x=5;
const int& ref1=x; // reference non-const Lvalue
const int y=7;
const int& ref2=y; // reference const Lvalue
const int& ref3=6; // reference Rvalue
상수를 포인팅하는 포인터처럼 const 참조는 const가 아닌 값을 참조할 수 있다.
단, 이 때 참조 접근을 하면 const가 아니더라도 const로 간주된다.
int value=5;
const int& ref=value; // const reference to variable value
value=6; // non-const: mutable
ref=7; // error: const_reference: immutalbe
References to Rvalues extend the lifetime of the referenced value
Rvalue는 표현식 범위를 가진다.(값이 생성된 표현식 끝에서 소멸함)

단 const에 대한 참조가 Rvalue로 초기화하면, Rvalue의 수명이 참조형 변수의 수명에 맞게 확장된다.
int somefcn(void){
const int& ref=2+3;
std::cout<<ref<<std::endl; // Rvalue
} // ref , Rvalue
Const references as function parameters
함수 매개변수로 사용되는 참조가 const인 경우,
해당 인수에 대해서 복사본을 만들지 않고, 인수에 접근할 수 있으며
함수는 참조되는 값을 변경하지 못한다.
void changeN(const int& ref){
ref=6; // error: const reference immutable
}
const 참조 매개변수를 사용해서 const Lvalue, non-const Lvalue, Rvalue등을 전달할 수 있다.
#include <iostream>
void printIt(const int& x){
std::cout<<x;
}
int main(void){
int a=1;
printIt(a);
const int b=2;
printIt(b);
printIt(3);
printIt(2+b);
return 0;
}
포인터나 기본 자료형이 아닌 타입의 복사본을 생성하지 않기 위해서 참조로 전달하는 것이 좋다.
기본자료형은 함수가 값을 변경해야 하는 경우가 아니라면 값으로 전달하는 것이 좋음